const http = require('http');
const fs = require('fs');
const cheerio = require('cheerio');
const request = require('request');
let Parent = 1;//爬取的父级页面
let page = 0;//控制爬取几张主页
//const url = "http://www.ss.pku.edu.cn/index.php/newscenter/news/2391";//初始url
let newUrl = `http://www.hacg.love/wp/`;//琉璃神社

function fetchPage(x) {     //封装了一层函数
    startRequest(x);
}

function startRequest(x) {
    //采用http模块向服务器发起一次get请求
    http.get(x, function (res) {
        let html = '';        //用来存储请求网页的整个html内容

        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件，每次取一块数据
        res.on('data', function (chunk) {
            html += chunk;
        });

        //监听end事件，如果整个网页内容的html都获取完毕，就执行回调函数
        res.on('end', function () {
            let $ = cheerio.load(html); //采用cheerio模块解析html

            //let arr = [];

            let htmlLength = $('.entry-title a');
            function *getHomepage() {
                for (let a = 0; a < htmlLength.length; a++) {
                    let href = $(htmlLength[a]).attr('href');
                    /*等待操作完成才继续执行*/
                    yield getHtml(href);
                }
            }

            /*自执行判定函数*/
            let setHomepage = getHomepage();
            (function proving(){
                console.log('===============创建连接===============');
                let a = setHomepage.next();
                if(!a.done) {
                    console.log('循环会继续');
                    a.value.then(function(data) {
                        proving();
                    }, function(error) {
                        proving();
                    })
                } else {
                    console.log('最后的循环结束');
                    Parent++;
                    page++;
                    let url = `http://www.hacg.love/wp/page/${Parent}/`;//下一个地址
                    if (page <= 10) {
                        fetchPage(url);      //主程序重复执行http://www.hacg.love/wp/page/2/
                    }
                }
            })()
        });
    }).on('error', function (err) {
        console.log(err);
    });
}

/*解析子级页面*/
function getHtml(href) {
    return new Promise((resolve, reject) => {
        http.get(href, function (res) {
            let html = '';        //用来存储请求网页的整个html内容
            res.setEncoding('utf-8'); //防止中文乱码
            let seeds = [];
            //监听data事件，每次取一块数据
            res.on('data', function (chunk) {
                html += chunk;
            });
            res.on('end', function () {
                let $ = cheerio.load(html); //采用cheerio模块解析html
                let flag = false;
                $('.tablebody').each(function () {
                    let b = /[^A-Z]*[A-Z]|[^a-z]*[^a-z]+[^0-9]*[0-9]/;
                    let a = $(this).text().trim();
                    let c = a.match(b);
                    if (c) {
                        let f = c['input'].match(/[\u3040-\u309F\u30A0-\u30FF]/);
                        if (!f) {
                            console.log('第一种');
                            let input = c['input'];
                            let arr = seed(input);
                            console.log(arr);
                            if(arr){
                                seeds = [...seeds, ...arr];
                            }
                            flag = true;
                        }
                    }
                });

                if (!flag) {
                    $('.metaslider').prevAll().find('p').each(function () {
                        let b = /[^A-Z]*[A-Z]|[^a-z]*[^a-z]+[^0-9]*[0-9]/;//判定必须包含大写字母和数字或者小写字母和数字
                        let a = $(this).text().trim();
                        let c = a.match(b);
                        if (c) {
                            let f = c['input'].match(/[\u3040-\u309F\u30A0-\u30FF]/);//是否包含日文
                            if (!f) {
                                console.log('第二种');
                                let input = c['input'];
                                console.log(input);
                                let arr = seed(input);
                                console.log(arr);
                                if(arr){
                                    seeds = [...seeds, ...arr];
                                }
                                flag = true;
                            }
                        }
                    });
                }

                if (!flag) {
                    $('.metaslider').prevAll().each(function () {
                        let b = /[^A-Z]*[A-Z]|[^a-z]*[^a-z]+[^0-9]*[0-9]/;
                        let a = $(this).text().trim();
                        let c = a.match(b);
                        if (c) {
                            let f = c['input'].match(/[\u3040-\u309F\u30A0-\u30FF]/);
                            if (!f) {
                                console.log('第三种');
                                let input = c['input'];
                                let arr = seed(input);
                                console.log(arr);
                                if(arr){
                                    seeds = [...seeds, ...arr];
                                }
                                flag = true;
                            }
                        }
                    });
                }

                let suc = savedContent($, seeds);
                suc.then(function(data) {
                    resolve(seeds);
                }, function(error) {
                    resolve(seeds);
                })
            });
        }).on('error', function (err) {
            console.log(err);
            reject(err);
        });
    });
}

/*获取种子的函数*/
function seed(content) {
    let arr = [];
    let re = /[\u4e00-\u9fa5]/; //测试中文字符的正则
    if(content) {
        if(re.test(content)) { //使用正则判断是否存在中文
            let flag = true;
            let arr1 = [];
            let index = 0;
            for(let i = 0; i < content.length; i++) {
                if(!re.test(content[i])) {
                    if(flag) {
                        flag = false;
                        let indexFlag = arr1[index - 1] ? arr1[index - 1].end : 0;
                        let stringStr = content.indexOf(content[i], indexFlag);
                        arr1[index] = {
                            str: stringStr,
                            end: null,
                        };
                    }
                }

                if(!flag) {
                    if(re.test(content[i])) {
                        //let stringEnd = content.indexOf(content[i - 1]);
                        arr1[index].end = content.indexOf(content[i - 1]);
                        flag = true;
                        index++;
                    }
                }
            }
            for(let i = 0; i < arr1.length; i++) {
                if(!arr1[i].end) {
                    arr1[i].end = content.length;
                }
            }
            for(let i = 0; i < arr1.length; i++) {
                let page = arr1[i];
                let a = content.slice(page.str, page.end);
                if(a.length === 40) {
                    arr.push(a)
                }
            }
            return arr;
        } else {
            if(content.length === 40) {
                arr.push(content)
            }
            return arr;
        }
    } else {
        return arr;
    }
}

//该函数的作用：在本地存储所爬取的新闻内容资源
function savedContent($, news_title) {
    return new Promise((resolve, reject) => {
        let title = $('.entry-title').text();
        console.log(title);
        let textContent = `${title}\r\n`;
        for(let i = 0;i<news_title.length;i++){
            textContent = `${textContent}\r\nmagnet:?xt=urn:btih:${news_title[i]}\r\n`;
        }
        if(news_title.length === 0){
            textContent = `${textContent}\r\n没有种子可以爬取\r\n`;
        }
        fs.appendFile('./data/H.txt', textContent, 'utf-8', function (err) {
            if (err) {
                console.log(err);
                reject(false);
            }
            resolve(true);
        });
    });
}

//该函数的作用：在本地存储所爬取到的图片资源
/*function savedImg($, news_title) {
    $('.entry-content img').each(function () {
        let img_title = $(this).parent().next().text().trim();  //获取图片的标题
        if (img_title.length > 35 || img_title == "") {
            img_title = "Null";
        }
        let img_filename = img_title + '.jpg';

        let img_src = $(this).attr('src'); //获取图片的url

        //采用request模块，向服务器发起一次请求，获取图片资源
        request.head(img_src, function (err, res, body) {
            if (err) {
                console.log(err);
            }
        });
        request(img_src).pipe(fs.createWriteStream('./image/' + news_title + '---' + img_filename));     //通过流的方式，把图片写到本地/image目录下，并用新闻的标题和图片的标题作为图片的名称。
    })
}*/

fetchPage(newUrl);      //主程序开始运行